package RSS.bean;

import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * @program: gitee4_socket
 * @description: 利用SAX解析RSS数据
 * @author: zy
 * @create: 2024-07-23 20:41
 */
public class RSSDataCapturer extends DefaultHandler {

    private Logger log= Logger.getLogger(RSSDataCapturer.class.getName() );

    private List<CommonInformationItem> list;

    private CommonInformationItem item;
    private String source;   //RSS的源名称
    private int status;    //存当前解析到什么标记.

    private StringBuffer buffer;   //存文本.

    //private DateFormat df=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
    private DateFormat df=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z",Locale.ENGLISH );




    public RSSDataCapturer (String name){
        this.source=name;   //RSS源名
        buffer=new StringBuffer();
    }

    /**
     * 解析source对应的RSS源，得到 item集合，返回.
     * @param source
     * @return
     */
    public List<CommonInformationItem> load(   String source ){

        try {
            // SAX解析流程代码
            // 1. 创建SAX解析器
            SAXParserFactory spf = SAXParserFactory.newInstance();
            // 2. 注册事件处理器
            SAXParser parser = spf.newSAXParser();
            // 3. 解析xml文件
            parser.parse(source, this);
        }catch(Exception ex){
            ex.printStackTrace();
            log.error(    ex);
        }
        return list;
    }

    //解析到xml文件的开头
    @Override
    public void startDocument() throws SAXException {
        log.debug("文档开头, 开始解析, 创建 List");
        list=new ArrayList<>();
        super.startDocument();
    }

    //解析到xml文件的开头
    @Override
    public void endDocument() throws SAXException {
        log.debug("文档结尾");
        super.endDocument();
    }

    private final int STATUS_TITLE=1;
    private final int STATUS_LINK=2;
    private final int STATUS_DESCRIPTION=3;
    private final int STATUS_PUBDATE=4;
    private final int STATUS_GUID=5;


    //解析到一个元素的开头
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        log.debug("元素的开头:"+    uri+"\t"+ localName+"\t"+ qName+"\t"+ attributes );
        //记录当前解析的是什么
        if(   item!=null && qName.equalsIgnoreCase("title")  ){
            status=  STATUS_TITLE ;
        }else if( item!=null &&   qName.equalsIgnoreCase("link") ){
            status=STATUS_LINK;
        }else if( item!=null &&  qName.equalsIgnoreCase("description")){
            status=STATUS_DESCRIPTION;
        }else if( item!=null &&  qName.equalsIgnoreCase("pubDate")){
            status=STATUS_PUBDATE;
        }else if( item!=null &&   qName.equalsIgnoreCase("guid")){
            status=STATUS_GUID;
        }else if(  qName.equalsIgnoreCase("item")){
            item=new CommonInformationItem();
            item.setSource( this.source   );
        }
    }

    //解析到一个元素的结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // </a>
        log.debug("元素的结束:"+    uri+"\t"+ localName+"\t"+ qName+"\t" );
       //判断你解析的是哪个结束元素
        if(   item!=null && qName.equalsIgnoreCase("title")  ){
            item.setTitle(  buffer.toString()  );
            status=  0;
        }else if( item!=null &&   qName.equalsIgnoreCase("link") ){
            item.setLink(  buffer.toString()  );
            status=0;
        }else if( item!=null &&  qName.equalsIgnoreCase("description")){
            item.setDescription(buffer);
            status=0;
        }else if( item!=null &&  qName.equalsIgnoreCase("pubDate")){
            item.setTxtDate(   buffer.toString());
            try {
                item.setDate(df.parse(buffer.toString().trim()));
            }catch(Exception ex){
                log.error(    "日期格式转换错误： 源:"+ source +"   日期格式:" +   buffer.toString().trim() );
            }
            status=0;
        }else if( item!=null &&   qName.equalsIgnoreCase("guid")){
            item.setId(    buffer.toString());
            status=0;
        }else if(  qName.equalsIgnoreCase("item")){
            if(  item.getId()==null ){
                item.setId(    item.getDescription().hashCode() +"");
            }
           list.add(  item);
           item=null;
        }
        buffer=new StringBuffer();
    }

    //解析到一个文本
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String txt=new String(   ch, start, length );
        log.debug(   "解析到了文字:"+   new String(  ch, start, length )     );
        buffer.append(   txt );
    }
}
